Je liste les contacts du service Web et je les affiche dans le tableau `` sectionné '' des contacts, comme indiqué sur la capture d'écran. Le problème est que j'obtiens les mêmes valeurs de balise pour les cases à cocher de la première ligne de la section A ainsi que de la section S. J'ai trié un tableau et affiché dans la vue de table indexée. Comment obtenir différentes valeurs de balise en fonction de indexPath.row quel que soit le nombre de sections affichées. Voici ce que j'ai essayé Dans cellForRowAtIndexPath: UIButton * checkBox; if (UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiomPhone) { checkBox = [[Allocation UIButton] initWithFrame: CGRectMake (7, 8, 30, 30)]; } autre { checkBox = [[Allocation UIButton] initWithFrame: CGRectMake (15, 13, 30, 30)]; } // int cnt = 0; // pour (int i = indexPath.section - 1; i> 0; i--) // { // cnt + = [[objectsForCharacters objectForKey: [arrayOfCharacters objectAtIndex: i]] count]; // arrayOfCharachters a le caractère 'A' à 'Z' //} //checkBox.tag = cnt + indexPath.row; [checkBox setImage: [UIImage imageNamed: @ "checkBox.png"] forState: UIControlStateNormal]; [checkBox addTarget: auto-action: @selector (checkBoxClicked :) forControlEvents: UIControlEventTouchUpInside]; [checkBox setTag: indexPath.row]; [cell.contentView addSubview: checkBox]; cellule de retour; } - (void) checkBoxClicked: (id) expéditeur { CGPoint buttonPosition = [convertPoint expéditeur: CGPointZero toView: self.tableViewContact]; NSIndexPath * indexPath = [self.tableViewContact indexPathForRowAtPoint: buttonPosition]; UIButton * tappedButton = (UIButton *) expéditeur; NSLog (@ "Numéro d'étiquette =% d", [étiquette d'expéditeur]); if ([tappedButton.currentImage isEqual: [UIImage imageNamed: @ "checkBox.png"]]) { [sender setImage: [UIImage imageNamed: @ "checkBoxMarked.png"] forState: UIControlStateNormal]; if (indexPath! = Nil) { NSString * finalIntId = [mutableArrayOfIds objectAtIndex: indexPath.row]; // stocker les identifiants des cases à cocher dans mutableArrayOfIds NSLog (@ "ID du bouton coché étiqueté =% @", finalIntId); [arrayOfIds addObject: finalIntId]; } // NSString * finalIntId = [mutableArrayOfIds objectAtIndex: tappedButton.tag]; // NSString * finalIntId = [mutableArrayOfIds objectAtIndex: indexPath.row]; } autre { [sender setImage: [UIImage imageNamed: @ "checkBox.png"] forState: UIControlStateNormal]; NSLog (@ "Non vérifié"); // [arrayOfIds removeObjectAtIndex: tappedButton.tag]; } } - (NSString *) tableView: (UITableView *) tableView titleForHeaderInSection: (NSInteger) section { if ([arrayOfCharacters count] == 0) { revenir @""; } return [NSString stringWithFormat: @ "% @", [arrayOfCharacters objectAtIndex: section]]; } - (NSArray *) sectionIndexTitlesForTableView: (UITableView *) tableView { NSArray * toBeReturned = [NSArray arrayWithArray: [@ "A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | # " componentsSeparatedByString: @ "|"]]; return toBeReturned; } - (NSInteger) tableView: (UITableView *) tableView sectionForSectionIndexTitle: (NSString *) title atIndex: (NSInteger) index { NSInteger count = 0; for (NSString * caractère dans arrayOfCharacters) { if ([caractère isEqualToString: titre]) { nombre de retours; } count ++; } return 0; } - (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView { return [arrayOfCharacters count]; // retourne 1; } - (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: section (NSInteger) { // return [nombre mutableArray]; return [[objectsForCharacters objectForKey: [arrayOfCharacters objectAtIndex: section]] count]; }
2020-12-07 22:55:10
vous définissez la même valeur de balise pour toutes les sections qui ont la même ligne. L'indexPath a deux propriétés, {section, row}. Disons que la section A a deux lignes, pour row1 -> indexPath.section = 0, indexPath.row = 0; pour row2-> indexPath.section = 0, indexPath.row = 1; Disons que la section S a deux lignes, pour row1 -> indexPath.section = 1, indexPath.row = 0; pour row2-> indexPath.section = 1, indexPath.row = 1; Ainsi, pour la ligne 1 de la section A et la ligne 1 de la section S, vous définissez la même valeur de balise qui est 0. Il y a votre problème. Essayez de définir la valeur de la balise comme ci-dessous. button.tag = indexPath.section * 1000 + indexPath.row; lors de la récupération de la section et de la ligne, Section NSInteger = (bouton.tag) / 1000; NSInteger row = (bouton.tag)% 1000; | Essaye ça... - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath { static NSString * CellIdentifier = @ "Cell"; UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier]; if (cellule == nil) { cell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: CellIdentifier]; } UIButton * checkBox = [[UIButton alloc] initWithFrame: CGRectMake (280, 10, 50, 44)]; checkBox.backgroundColor = [UIColor orangeColor]; [checkBox addTarget: auto-action: @selector (checkBoxClicked: event:) forControlEvents: UIControlEventTouchUpInside]; [checkBox setTag: indexPath.row]; [cell.contentView addSubview: checkBox]; cellule de retour; } - (void) checkBoxClicked: événement de l'expéditeur (id): événement (id) { NSSet * touches = [événement allTouches]; UITouch * touch = [touche anyObject]; CGPoint currentTouchPosition = [touch locationInView: self.tv]; // ici tv est un objet TableView NSIndexPath * indexPath = [self.tv indexPathForRowAtPoint: currentTouchPosition]; NSLog (@ "valeur de indePath.section% d, indexPath.row% d", indexPath.section, indexPath.row); } | Cela se produit parce que vous attribuez une balise aux boutons INDÉPENDANTS des sections. Les deux premières lignes des sections A et S ont une ligne = 0. Ainsi, la balise attribuée à leur bouton respectif est 0. Vous devez les affecter en gardant la référence à vos sections. Je suggérerais d'attribuer un indice d'accessibilité avec une forme séparée par des virgules contenant Section, Ligne. Et dans votre méthode - (void) checkBoxClicked: (id) expéditeur { // sélectionne une chaîne dans une forme séparée par des virgules. La première est votre section, la deuxième est la ligne. } la deuxième option est Faites ce que vous faites et implémentez votre méthode Button comme ceci. CGPoint buttonPosition = [convertPoint de l'expéditeur: CGPointZero toView: self.tableView]; NSIndexPath * indexPath = [self.tableView indexPathForRowAtPoint: buttonPosition]; if (indexPath! = nil) { ... indexpath.section est votre section, index path.row est votre ligne. } Il existe également une troisième option. dans cellforRowAtIndexpath, attribuez un titre à votre Button - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath [btn setTitle: <# Your Row #> forState: UIControlStateDisabled]; [btn setTag <#Your Section #>]; Ainsi, lors de la réception de votre méthode Button, vous pouvez avoir à la fois Section (Tag) et Row (Titre pour l'état désactivé). - (void) checkBoxClicked: (id) sender {[bouton titleForState: UIControlStateDisabled]; // votre ligne button.tag // votre section} | Essaye ça! Chaque section, vous pouvez connaître le nombre de section à droite, puis ajouter le nombre de lignes individuelles. [[fieldTitlesList objectAtIndex: indexPath.section - 1] count] + indexPath.row Où fieldTitlesList est le tableau de vos sections. | J'ai ajouté le code suivant qui a résolu mon problème NSInteger rowNumber = 0; pour (NSInteger i = 0; i